#include "server_function.h"


#define PORT 6666
#define SERVERIP "0.0.0.0"
#define PERROR(a) do{perror("a");return -1;}while(0)    

void handler(int arg);
void exe_sql(char *sql);

sqlite3 * db=NULL;
char sql[128]={0};
char **resultp=NULL;
int nrow=0;
int ncolumn=0;
char * errmsg=NULL;
int sockfd;

int main()
{
    int clifd =0;
    ssize_t ret =0;
    pid_t pid=0;
    int addrlen = sizeof(struct sockaddr);
    MSG msg;
    //---------------------------------数据库表的建立------------------------------------------
    //打开数据库
    if(sqlite3_open("./my.db",&db))
    {
        printf("打开数据库失败\n");
        return -1;
    }
    //创建一张root表（username,passwd）
    memset(sql,0,128);
    sprintf(sql,"create table if not exists root(user text,password text);");
    exe_sql(sql);
    //创建一张普通用户表（）
    
    memset(sql,0,128);
    sprintf(sql,"create table if not exists user(id text,password text,name text,age int,gender text,phone int,wage int,seniority int);");
    exe_sql(sql);

    //创建一张历史记录表（）
     memset(sql,0,128);
    sprintf(sql,"create table if not exists user_history(id text,record text);");
    exe_sql(sql);


    
    //---------------------------------TCP通信连接建立-----------------------------------------
    //创建套接字
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd == -1)
    {
        PERROR(socket);
    }
    printf("socket is already ok!\n");
    
    //封装sockaddr_in结构体
    struct sockaddr_in ser_addr,cli_addr;
    ser_addr.sin_family = AF_INET;
    ser_addr.sin_port = htons(PORT);
    ser_addr.sin_addr.s_addr = inet_addr(SERVERIP);

    //bind绑定本机ip及端口
    if(-1 == bind(sockfd,(struct sockaddr *)&ser_addr,sizeof(struct sockaddr)))
    {
        close(sockfd);
        PERROR(bind);
    }
    printf("bind host success\n");

    //监听套接字
    if(-1 == listen(sockfd,1024))
    {
        close(sockfd);
        PERROR(listen);
    }
    printf("listening\n");
    
    //处理僵尸进程
    signal(SIGCHLD,handler);

    while(1)
    { 
        //接收客户端的请求
        clifd = accept(sockfd,(struct sockaddr*)&cli_addr,&addrlen);
        if(-1 == clifd)
        {
            PERROR(accept);
        }
        printf("accept client success\n");

        //创建一个进程
        pid=fork();
        if(pid < 0)
        {
            PERROR(fork);
        }
        else if(pid == 0)      //子进程
        {
            close(sockfd);//关闭监听套接字
            while(1)
            {
                
                memset(&msg,0,sizeof(MSG));
                
                //ret = recv(clifd,&msg,sizeof(msg),0);     //读取客户端发送过来的结构体
                ret = read(clifd,&msg,sizeof(msg));
                printf("%d\n",msg.type);
                printf("%d\n",ret);
                if (ret <=0)
                {
                    break;
                }
                switch(msg.type)
                {
                    case Q:
                        //普通用户登录
                        printf("进入选择界面执行选择函数\n");
                        my_up(&msg,db,clifd);
                        break;
                    case W:
                        //普通用户注册
                        my_in(&msg,db,clifd);
                        break;
                    case E:
                        //管理员登录
                        root_up(&msg,db,clifd);
                        break;
                    case R:
                        //删除
                        my_del(&msg,db,clifd);
                        break;
                    case T:
                        //退出程序
                        break;
                    case Y:
                        //历史查询
                        my_history(&msg,db,clifd);
                        break;
                    case U:
                        //信息查询
                        my_message(&msg,db,clifd);
                        break;
                    case I:
                        //信息修改
                        my_amend(&msg,db,clifd);
                        break;
                    case O:
                        //密码修改
                        my_password(&msg,db,clifd);
                        break;
                    case P:
                        //新增成员
                        my_new(&msg,db,clifd);
                        break;
                    default:
                        break;
                }
            }
        }
        else                  //父进程
        {
            close(clifd);//关闭通信套接字

        }

        }
        //关闭数据库
        if(sqlite3_close(db))
        {
            printf("关闭数据库失败\n");
            return -1;
        }
        //关闭套接字
        if(-1 == close(sockfd))
        {
            PERROR(close);
        }

    return 0;
}





//僵尸进程处理函数
void handler(int arg)
{
    waitpid(-1,NULL,WNOHANG);
}

//执行SQL语句函数
void exe_sql(char *sql)
{
    if(sqlite3_get_table(db,sql,&resultp,&nrow,&ncolumn,&errmsg))
    {
        printf("%s\n",errmsg);
        return ;
    }

}
